﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using DataTier.Entities;
using DataTier.Helpers;

namespace DataTier.Repository
{
    /// <summary>
    /// Репозиторий для работы со статусами документов
    /// </summary>
    public class StatesRepository : RepositoryBase
    {
        public StatesRepository()
        {

        }

        public StatesRepository(IDbConnection connection)
            : base(connection)
        {

        }


        /// <summary>
        /// Возвращает текущий статус конкретного документа по его Id и типу
        /// </summary>
        /// <param name="type"></param>
        /// <param name="id"></param>
        /// <returns></returns>
        public int GetDocumentState(int currentUserId, int type, int id)
        {
            switch (type)
            {
                case (int)DocTypeEnum.Order:
                    using (var dbcontext = CreateDataContext())
                    {
                        var order = dbcontext.Order.Where(o => o.Id == id).FirstOrDefault();
                        if (order == null)
                            throw new Exception(string.Format("Документа с Id='{0}' не существует в системе!", id));

                        return order.StateId;
                    }
                default:
                    throw new Exception(string.Format("Типа документов '{0}' не существует в системе!", type));
            }
        }

        
        /// <summary>
        /// Устанавливает новый статус конкретному документу по его Id и типу
        /// </summary>
        /// <param name="type"></param>
        /// <param name="id"></param>
        public void SetDocumentState(int currentUserId, int type, int id, int stateId)
        {
            switch (type)
            {
                case (int)DocTypeEnum.Order:
                    using (var dbcontext = CreateDataContext())
                    {
                        var order = dbcontext.Order.Where(o => o.Id == id).FirstOrDefault();
                        if (order == null)
                            throw new Exception(string.Format("Документа с Id='{0}' не существует в системе!", id));

                        if (stateId == (int)StateEnum.CreatedAccount)
                        {
                            // Создается номер для нового документа
                            int nextNumber = 1;
                            var docNumber = dbcontext.DocNumbers.Where(n => n.DocType == "Account").FirstOrDefault();
                            if (docNumber != null)
                            {
                                nextNumber = docNumber.NextNumber;
                                docNumber.NextNumber += 1;
                            }
                            order.AccNumber = DocNumberHelper.GetNewAccountNumber(nextNumber);
                            order.AccCreatedDate = DateTime.Now;
                            order.AccCreatedUserId = currentUserId;
                        }

                        order.ModifiedDate = DateTime.Now;
                        order.ModifiedUserId = currentUserId;
                        order.StateId = stateId;
                        dbcontext.SaveChanges();
                    }
                    break;

                case (int)DocTypeEnum.ExpendBill:
                    using (var dbcontext = CreateDataContext())
                    {
                        var expendBill = dbcontext.ExpendBill.Where(b => b.Id == id).FirstOrDefault();
                        if (expendBill == null)
                            throw new Exception(string.Format("Документа с Id='{0}' не существует в системе!", id));

                        expendBill.ModifiedDate = DateTime.Now;
                        expendBill.ModifiedUserId = currentUserId;
                        expendBill.StateId = stateId;
                        dbcontext.SaveChanges();
                    }
                    break;

                case (int)DocTypeEnum.ConsolidatedAccount:
                    using (var dbcontext = CreateDataContext())
                    {
                        var account = dbcontext.ConsolidatedAccount.Where(b => b.Id == id).FirstOrDefault();
                        if (account == null)
                            throw new Exception(string.Format("Документа с Id='{0}' не существует в системе!", id));

                        account.StateId = stateId;
                        dbcontext.SaveChanges();
                    }
                    break;

                default:
                    throw new Exception(string.Format("Типа документов '{0}' не существует в системе!", type));
            }
        }


    }
}
